package com.jxud.utils;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.ThreadLocalRandom;

/**
 * 订单号生成器
 * 保证生成的订单号在高并发下也不重复
 */
public class OrderNumberGenerator {

    // 日期时间格式化器
    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");

    // 原子整数，用于生成序列号，避免重复
    private static final AtomicInteger sequence = new AtomicInteger(0);

    // 最大序列号，防止溢出
    private static final int MAX_SEQUENCE = 999;

    // 随机数生成器
    private static final ThreadLocalRandom random = ThreadLocalRandom.current();

    // 锁，用于在极端情况下保证序列号的唯一性（可选，根据需求）
    private static final ReentrantLock lock = new ReentrantLock();

    /**
     * 生成唯一的订单号
     * 格式：yyyyMMddHHmmss + 3位随机数 + 3位序列号
     * 总长度：14(时间) + 3(随机) + 3(序列) = 20位
     *
     * @return 唯一的订单号
     */
    public static synchronized String generateOrderNumber() {
        // 获取当前时间
        String timestamp = LocalDateTime.now().format(FORMATTER);

        // 生成3位随机数 (100-999)
        int randomNumber = random.nextInt(100, 1000);

        // 获取并增加序列号
        int seq = sequence.getAndIncrement();

        // 如果序列号超过最大值，则重置为0
        if (seq > MAX_SEQUENCE) {
            // 使用锁确保重置操作的原子性
            lock.lock();
            try {
                if (sequence.get() > MAX_SEQUENCE) {
                    sequence.set(0);
                    seq = 0;
                }
            } finally {
                lock.unlock();
            }
        }

        // 格式化序列号为3位数字
        String sequenceStr = String.format("%03d", seq);

        // 组合生成订单号
        return "SLY"+ timestamp + randomNumber + sequenceStr;
    }

}